iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Software Development

30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰系列 第 4

[Day 04] 用過gcc了吧? 那我們現在來了解gcc!

  • 分享至 

  • xImage
  •  

這篇你會學到

gcc 基本語法與其用途

昨天的文章 (我是傳送門) 學會了使用gcc編譯檔案,產生可以在WSL上面運行的執行檔,接下來,會來介紹幾個gcc常用的語法。

對了,結果我昨天查了一下,其實網路上就有蠻多大神在寫This is fine. ASCII art ....

這告訴我們在埋頭苦幹之前,必定要先看看先人走過的道路。
因為歷史是最好的老師,前人的經驗與智慧,往往能讓我們少走彎路,找到正確的方向。
如果我們只是一味低頭努力,卻忽視了已有的成果與失敗的教訓,就容易陷入盲目的辛苦。
唯有抬頭觀察、善用前人的智慧,再結合自己的奮鬥,才能真正達到事半功倍的效果。

因此我們來看看前人寫的官方網站吧....

一起來看 GCC 官方語法網站

https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
開始導讀 ↑ 前我們需要先理解 gcc的編譯過程,這樣才可以更好理解上面網址裡面的內容。

gcc 的編譯流程

一般來說,gcc編譯的流程分為 4 步驟

  • 預處理(Preprocessing)
    展開 #include#define → 得到 .i
  • 編譯(Compilation)
    .i 翻譯成組合語言 → 得到 .s
  • 組譯(Assembling)
    .s 轉成二進位的目標檔 → 得到 .o
  • 連結(Linking)
    把多個 .o 檔和函式庫合併 → 最終 執行檔 (預設名稱會是a.out)
簡而言之
  • .c:人類寫的程式
  • .i:展開 include & 巨集後的程式
  • .s:組合語言
  • .o:機器碼(中間產物)
  • a.out:最終執行檔

gcc 官方網站導讀

我們現在來回到這邊
https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html

Overall Options

主要講編譯的方法,可以分成3種

  • -c (只編譯不連結)
    • 功能:把 .c 檔編譯成 目標檔 .o,但不會產生執行檔
    • 使用時機:大型專案通常會先把多個 .c 編譯成 .o,最後再一起連結
gcc -c main.c      # 產生 main.o
gcc -c dog_meme.c  # 產生 dog_meme.o
gcc main.o dog_meme.o -o dog_meme

  • -o file (輸出檔案名稱)
    • 功能:指定編譯結果的檔名
    • 預設輸出的檔案名稱是 a.out (也可以像下面依樣用-o指定成main)
  • 範例:
    gcc main.c -o main
  • 也可以不命名:
    gcc main.c
  • -v (顯示詳細編譯過程)
    • 功能:顯示 gcc 執行了哪些「背後步驟」(預處理、編譯、組譯、連結)[[#gcc 的編譯流程]]
    • 使用時機:想了解編譯過程,或檢查 gcc 使用了哪些 include 路徑、連結哪些庫
  • 範例:
    gcc -v main.c -o main
C Language Options
Warning Options
  • -Wall (開啟大部分警告)
    • 功能:打開一組「常見錯誤」警告,例如未使用變數、未宣告的函式
  • -Wextra (更多警告)
    • 功能:比 -Wall 更嚴格,例如未使用的參數、隱含型別轉換
-Werror (把警告當錯誤)
  • 功能:只要有警告就會讓編譯失敗。
  • 使用時機:團隊專案常用。
  • 範例:
    gcc -Wall -Wextra -Werror main.c -o main
Debugging Options -> -ggdb
  • -g (生成除錯資訊,配合 gdb)
    • 功能:在執行檔裡加入「行號、變數名稱」資訊,方便 gdb 除錯
    • 範例:
      gcc -g main.c -o main gdb ./main
  • -ggdb (針對 gdb 的最佳除錯資訊)
    • 功能:比 -g 更完整,包含 gdb 專用的資訊
    • 建議:用 gdb 除錯時加上 -ggdb,比單純 -g
Optimization Options -> -O2
  • -O0 (不最佳化,除錯時用)
    • 功能:編譯快,程式和原始碼對應最直觀
    • 預設值就是 -O0
  • 適合用來除錯。
  • -O2 (常用平衡版最佳化)
    • 功能:平衡效能與編譯時間,最常用的選項
    • 適合:大部分實際部署
  • -O3 (速度最大化)
    • 功能:開啟更激進的最佳化(例如循環展開、向量化)。
    • 缺點:編譯時間較長,程式體積可能變大。
    • 適合:效能瓶頸的程式。
  • -Os (縮小體積)
    • 功能:針對程式大小做最佳化。
    • 適合:嵌入式系統或儲存空間有限環境。
Preprocessor Options
Link Options -> -llib
  • -Ldir` (指定函式庫路徑)
    • 功能:告訴 gcc 去哪裡找函式庫檔(.a.so
    • 範例:
      gcc main.c -L/usr/local/lib -lmylib -o main
  • -llib (連結函式庫)
  • 功能:連結函式庫,寫法是 -lxxx → 代表 libxxx.alibxxx.so
  • 範例:
    gcc main.c -lm -o main
    -lm 代表連結數學函式庫 libm,才能用 sqrt()sin() 等函式。

上一篇
[Day 03] 用gcc編譯我人生第一個 C 程式:不是 Hello World!
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰4
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言